home *** CD-ROM | disk | FTP | other *** search
- (************************************* function Generate *************)
- function Generate (var Seed: longint): real;
-
- { Algorithm 2 from CACM, pg. 1195, vol. 31, no. 10, (October, 1988). }
- { modified for longint values as recommended in Cooper, D. 1993 }
- { Oh! Pascal!, 3rd edition, pp. A16-A17 }
-
- const
- MODULUS = 2147483647;
- MULTIPLIER = 16807;
- QUOTIENT = 127773; {MODULUS div MULTIPLIER}
- REMAINDER = 2836; {MODULUS mod MULTIPLIER}
-
- var
- Low, Hi, Test: longint;
-
- begin
- {First, perform the calculation while avoiding overflow.}
- Hi := Seed div QUOTIENT;
- Low := Seed mod QUOTIENT;
- Test := (MULTIPLIER * Low) - (REMAINDER * Hi);
-
- {Second, update the seed for next time.}
- if Test > 0 then
- Seed := Test
- else
- Seed := Test + MODULUS;
-
- {Third, return a value in the range 0.0 < Generate < 1.0}
- Generate := Seed / MODULUS;
- end;
- (************************************* function Generate end ***********)
-